#-*- coding: utf-8 -*-
def serie_iter(n):
	'''
	serie geometrica
	'''
	k=0
	soma= 0.0
	
	while k<=n:
		soma += 1.0 / (2.0 ** k)
		k +=1
		pass
	return soma
	
# abordagem funcional
def serie_fun(n):
	if n==0:
		return 1.0
	else:
		return 1.0 / (2.0 ** n)  + serie_fun(n-1)
		
# abordagem funcional2
# usando os recursos da linguagem Python
def serie_fun2 (n) :
	return reduce ( lambda x , k : x + 1.0 / ( 2.0 ** k ) , range ( 0 , n+1) )

for k in range ( 21) :
	print k , serie_iter( k ) , serie_fun( k ) , serie_fun2 (k)
